
/**
 * 使用示例
 * 以下是一个完整的示例，展示如何使用这些类。
 */

public class PartAssemblyApp {
    public static void main(String[] args) {
        // 初始化规则引擎
        RuleEngine ruleEngine = new RuleEngine();

        // 添加上下游规则
        DependencyRule dependencyRule = new DependencyRule();
        dependencyRule.addDependency("body", "wheel"); // 车身是轮毂的上游
        ruleEngine.addRule(dependencyRule);

        // 添加颜色兼容性规则
        ColorCompatibilityRule colorRule = new ColorCompatibilityRule();
        colorRule.addIncompatibleColors("red", "green"); // 红色和绿色不兼容
        ruleEngine.addRule(colorRule);

        // 创建零件
        Part carBody = new Part("body1", "body");
        carBody.addAttribute("color", "green");

        Part wheel = new Part("wheel1", "wheel");
        wheel.addAttribute("color", "red");

        Part anotherWheel = new Part("wheel2", "wheel");
        anotherWheel.addAttribute("color", "blue");

        // 创建装配
        Assembly assembly = new Assembly(ruleEngine);

        // 添加零件
        System.out.println("Adding car body: " + assembly.addPart(carBody)); // true
        System.out.println("Adding red wheel: " + assembly.addPart(wheel)); // false (颜色不兼容)
        System.out.println("Adding blue wheel: " + assembly.addPart(anotherWheel)); // true

        // 打印装配中的零件
        System.out.println("Parts in assembly: ");
        for (Part part : assembly.getParts()) {
            System.out.println("Part ID: " + part.getId() + ", Type: " + part.getType());
        }
    }
}

/***
 * 扩展性
 * 添加新规则：
 * 实现 Rule 接口，创建新的规则类（如尺寸兼容性规则）。
 * 将新规则添加到 RuleEngine 中。
 * 支持更多属性：
 * Part 的 attributes 使用 Map，可以动态添加新属性（如重量、材质）。
 * 支持复杂装配：
 * 扩展 Assembly 类，支持层级结构（如子装配包含多个零件）。
 * 优化性能：
 * 对频繁检查的规则（如颜色规则）使用缓存。
 * 对大规模零件组合，使用索引或数据库存储。
 * 
 */

/***
 * 总结
 * 类设计：Part 表示零件，Rule
 * 和其实现（DependencyRule、ColorCompatibilityRule）定义配对规则，RuleEngine 管理规则，Assembly
 * 管理零件组合。
 * 规则实现：通过接口和动态规则列表，支持上下游关系、颜色兼容性等约束。
 * 关系：Assembly 依赖 RuleEngine，RuleEngine 聚合 Rule，Rule 检查 Part。
 * 使用方式：通过添加零件和规则，动态验证装配是否合法。
 */